package model;

public class Echiquier {

	Jeu jeu1;
	Jeu jeu2;

	Jeu currentPlayer;
	String message;

	public Echiquier()
	{
		jeu1 = new Jeu(Couleur.BLANC);
		jeu2 = new Jeu(Couleur.NOIR);
		currentPlayer = jeu1;
		setMessage("Init des plateaux, joueur blanc en premier");
	}

	public Couleur	getColorCurrentPlayer(){
		setMessage("Récupération de la couleur = " + currentPlayer.getCouleur());
		return currentPlayer.getCouleur();
	}

	public java.lang.String	getMessage(){
		return message;
	}

	private void setMessage(String message)
	{
		this.message = message;
	}

	public boolean	isEchec(){
		return false;
	}

	public boolean	isEchecEtMat(){
		return false;
	}

	private boolean isIntermediate(int xInit, int yInit, int xFinal, int yFinal)
	{
		if(xInit == xFinal) //Déplacement sur les Y
		{
			if(yFinal > yInit)
			{
				for(int i = yInit+1; i < yFinal; i++)
				{
					if(jeu1.isPieceHere(xInit, i) || jeu2.isPieceHere(xInit, i))
					{
						return true;
					}
				}
			}
			else if(yFinal < yInit)
			{
				for(int i = yInit-1; i > yFinal; i--)
				{
					if(jeu1.isPieceHere(xInit, i) || jeu2.isPieceHere(xInit, i))
					{
						return true;
					}
				}
			}
		}
		else if(yInit == yFinal) //Déplacement sur les X
		{			
			if(xFinal > xInit)
			{
				for(int i = xInit+1; i < xFinal; i++)
				{
					if(jeu1.isPieceHere(i, yInit) || jeu2.isPieceHere(i, yInit))
					{
						return true;
					}
				}
			}
			else if(xFinal < xInit)
			{
				for(int i = xInit-1; i > xFinal; i--)
				{
					if(jeu1.isPieceHere(i, yInit) || jeu2.isPieceHere(i, yInit))
					{
						return true;
					}
				}
			}
		}
		else //Diagonale
		{
			int i = xInit;
			int j = yInit;
			while(i != xFinal && j != yFinal)
			{
				i = (xFinal > xInit ? i+1 : i-1);
				j = (yFinal > yInit ? j+1 : j-1);
				if(i == xFinal && j == yFinal)
					break;
				if(jeu1.isPieceHere(i, j) || jeu2.isPieceHere(i, j))
				{
					return true;
				}
			}
		}

		return false;
	}

	//Permet de déplacer une pièce connaissant ses coordonnÃ©es initiales vers ses coordonnÃ©es finales.
	public boolean	move(int xInit, int yInit, int xFinal, int yFinal){
		if(currentPlayer.isMoveOk(xInit, yInit, xFinal, yFinal))
		{
			String type = currentPlayer.getPieceType(xInit, yInit);
			if(type != "model.Cavalier")
			{
				if(isIntermediate(xInit, yInit, xFinal, yFinal) == true) //S'il y a un intermédiaire
				{
					return false;
				}
			}

			Jeu autreJoueur = (currentPlayer.equals(jeu1) ? jeu2 : jeu1);

			
			if(currentPlayer.isPieceHere(xFinal, yFinal) || autreJoueur.isPieceHere(xFinal, yFinal))
			{
				if(autreJoueur.isPieceToCatchHere(xFinal, yFinal))
				{
					
					if(currentPlayer.getPieceType(xInit, yInit) == "model.Pion" && xInit != xFinal && yInit != yFinal) //Si c'est un pion qui se déplace en diago
					{
						autreJoueur.capture(xFinal, yFinal);
						return currentPlayer.Move(xInit, yInit, xFinal, yFinal);
					}
					else if(currentPlayer.getPieceType(xInit, yInit) != "model.Pion")
					{
						autreJoueur.capture(xFinal, yFinal);
						return currentPlayer.Move(xInit, yInit, xFinal, yFinal);
					}
				}
			}
			else
			{		
				if(!(currentPlayer.getPieceType(xInit, yInit) == "model.Pion" && xInit != xFinal && yInit != yFinal)) //Si ce n'est pas un pion qui se déplace en diago
				{
					return currentPlayer.Move(xInit, yInit, xFinal, yFinal);
				}
			}
		}
		return false;
	}

	//Permet de changer le joueur courant.
	public void	switchJoueur(){
		currentPlayer = (currentPlayer == jeu1 ? jeu2 : jeu1);
		setMessage("Switch Player :\n\tcurrentPlayer = " + getColorCurrentPlayer());
	}

	public java.lang.String	toString(){

		String currentPiece;
		String retour = "";

		for(int i = 0; i < 8;i++)
		{
			for(int j = 0;j < 8; j++)
			{
				if((currentPiece = jeu1.getPieceName(j, i)) != null)
				{
					retour += "  " + currentPiece;
					continue;
				}
				else if((currentPiece = jeu2.getPieceName(j, i)) != null)
				{
					retour += "  " + currentPiece;
					continue;
				}
				else
				{
					retour += "    ---";
					continue;
				}
			}
			retour += "\n";
		}

		return retour;
	}

	public static void main(String[] args) {
		Echiquier e = new Echiquier();
		System.out.println(e.toString());
	}
}
